Curvas ROC

Función para plotear la curva ROC

# Paquete para graficar la curva ROC
library(ROCR)
Loading required package: gplots

Attaching package: 'gplots'
The following object is masked from 'package:stats':

    lowess
plotROC <- function(prediccion, real, adicionar = FALSE, color = "red") {
  pred <- ROCR::prediction(prediccion, real)    
  perf <- ROCR::performance(pred, "tpr", "fpr")
  plot(perf, col = color, add = adicionar, main = "Curva ROC")
  segments(0, 0, 1, 1, col='black')
  grid()  
}

# Probamos la función
Score1 <- c(0.9, 0.9, 0.8, 0.5, 0.5, 0.4, 0.3, 0.1)
Clase1 <- c(1, 1, 1, 0, 1, 1, 0, 0)
plotROC(Score1, Clase1)

Score2 <- c(0.8, 0.8, 0.7, 0.5, 0.4, 0.3, 0.2, 0.1)
Clase2 <- c(1, 1, 1, 0, 1, 1, 0, 0)
plotROC(Score2, Clase2, adicionar = TRUE, color = "blue")

Función para calcular el área bajo la curva ROC

areaROC <- function(prediccion, real) {
  pred <- ROCR::prediction(prediccion, real)
  auc <- ROCR::performance(pred, "auc")
  return(attributes(auc)$y.values[[1]])
}

areaROC(Score1, Clase1)
[1] 0.9
areaROC(Score2, Clase2)
[1] 0.8666667

Ejemplo Scoring de Crédito

library(traineR)
setwd("~/Google Drive/MDCurso/Datos")
suppressWarnings(suppressMessages(library(e1071)))

datos <- read.csv("MuestraCredito5000V2.csv",sep = ";",header=T)
# Recodifica las variables como categóricas ordinales
datos$IngresoNeto <- factor(datos$IngresoNeto,ordered = TRUE)
datos$CoefCreditoAvaluo <- factor(datos$CoefCreditoAvaluo,ordered = TRUE)

muestra <- sample(1:nrow(datos),floor(nrow(datos)*0.15))
ttesting <- datos[muestra,]
taprendizaje <- datos[-muestra,]

modelo <- train.svm(BuenPagador ~ ., data = taprendizaje)
# Así nos genera la probabilidad con type = "prob"
prediccion <- predict(modelo, ttesting, type = "prob")
head(prediccion$prediction)
             No         Si
3549 0.04246596 0.95753404
2375 0.92119416 0.07880584
2583 0.07642483 0.92357517
1553 0.04982807 0.95017193
4481 0.07226017 0.92773983
3013 0.07431079 0.92568921
Score <- prediccion$prediction[,2]
Clase <- ttesting$BuenPagador
# Genera el gráfico
plotROC(Score,Clase)

areaROC(Score,Clase)
[1] 0.7769271


Agregando otra curva ROC al mismo gráfico

Generamos otro modelo con kernel = “linear”

modelo2 <- train.svm(BuenPagador ~ ., data = taprendizaje, kernel = "linear")
prediccion2 <- predict(modelo2, ttesting, type = "prob")
head(prediccion2$prediction)
              No        Si
3549 0.006812977 0.9931870
2375 0.648328946 0.3516711
2583 0.101070982 0.8989290
1553 0.101047797 0.8989522
4481 0.101037640 0.8989624
3013 0.101014519 0.8989855
Score2 <- prediccion2$prediction[,2]
Clase2 <- ttesting$BuenPagador

plotROC(Score, Clase)
plotROC(Score2, Clase2, adicionar=TRUE, color = "blue")

areaROC(Score2, Clase2)
[1] 0.6911735


Agregando otra curva ROC al mismo gráfico

Generamos otro modelo con kernel = “sigmoid”

modelo3 <- train.svm(BuenPagador ~ ., data = taprendizaje, kernel = "sigmoid")
prediccion3 <- predict(modelo3, ttesting, type = "prob")
head(prediccion3$prediction)
             No        Si
3549 0.06606285 0.9339372
2375 0.21663263 0.7833674
2583 0.12418185 0.8758181
1553 0.13126162 0.8687384
4481 0.14106937 0.8589306
3013 0.13810626 0.8618937
Score3 <- prediccion3$prediction[,2]
Clase3 <- ttesting$BuenPagador

plotROC(Score, Clase)
plotROC(Score2, Clase2, adicionar = TRUE, color = "blue")
plotROC(Score3, Clase3, adicionar = TRUE, color = "green")

areaROC(Score3, Clase3)
[1] 0.578091


Agregando otra curva ROC al mismo gráfico con Árboles de Decisión

modelo <- train.rpart(BuenPagador~.,data = taprendizaje)
prediccion5 <- predict(modelo, ttesting, type = "prob")
head(prediccion5$prediction)
             No         Si
3549 0.15151515 0.84848485
2375 0.94620253 0.05379747
2583 0.02259887 0.97740113
1553 0.03079076 0.96920924
4481 0.03079076 0.96920924
3013 0.03079076 0.96920924
Score5 <- prediccion5$prediction[,2]
Clase5 <- ttesting$BuenPagador

plotROC(Score, Clase)
plotROC(Score2, Clase2, adicionar = TRUE, color = "blue")
plotROC(Score3, Clase3, adicionar = TRUE, color = "green")
plotROC(Score5, Clase5, adicionar = TRUE, color = "magenta")

areaROC(Score5, Clase5)
[1] 0.8884838

¿Qué es lo que realmente grafica la curva ROC?

La curva ROC es una curva paramétrica

NO es una función \(y=f(x)\)

Definición de la Curva ROC

Sean \(f\) un modelo predictivo y \(y_i\) el score (puntaje o probabilidad) para la observación o individuo \(x_i\) dado por el modelo \(f\), es decir, \(y_i = f(x_i)\).

Sea \(T\) un umbral (threshold) entonces tenemos la regla asignación siguiente:

Si \(y_i \geq T\) entonces la clase es 1 (clase Positiva), sino la clase es 0 (clase Negativa).



¿Cómo se grafica la curva ROC?

La idea es ir variando el umbral e ir aplicando la regla de asignación con dicho umbral, luego formar la matriz de confusión y calular las tasas de Verdaderos Positivos y Faltos negativos, y por último ubicar dicho punto en el gráfico. Y así sucesivamente hasta formar toda la curva.

Notemos que el umbral 1 corresponde al punto (0, 0) en la curva ROC, esto pues al fijar el umbral como 1 todas las observaciones serán clasificadas como Negativas, y por tanto las tasas de Verdaderos Positivos y Falsos Positivos son ambas 0. De forma análoga el umbral 0 corresponde al punto (1, 1) en la curava ROC.

Por lo anterior hacemos variar el umbral de 1 hasta 0, notando que para un modelo \(f\) cada umbral \(T\) genera un punto en el espacio de la curva ROC.


Veamos el siguiente ejemplo.

Individuo Clase Score Individuo Clase Score
1 p 0.550 11 n 0.33
2 n 0.390 12 p 0.38
3 n 0.530 13 p 0.51
4 p 0.600 14 n 0.10
5 n 0.505 15 p 0.80
6 n 0.520 16 n 0.37
7 p 0.400 17 p 0.30
8 n 0.360 18 p 0.90
9 p 0.340 19 n 0.70
10 n 0.350 20 p 0.54


Usamos el paquete ROCR para generar la curva, posteriormente graficamos los puntos calculados de la manera explicada anteriormente.

library(ROCR)

Clase <- c(1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1)
Score <- c(0.6, 0.35, 0.53, 0.54, 0.505, 0.3, 0.8, 0.1, 0.33, 0.39, 0.34, 0.55, 0.51, 0.38, 0.36, 0.52, 0.9, 0.7, 0.37, 0.4)

# Graficamos ROC con funciones de paquete ROCR
plotROC(Score, Clase)

# Graficamos puntos con algoritmo
i <- 1  # Contador
FP_r <- -1  # Para que entre al condicional en la primera iteración
TP_r <- -1  # Para que entre al condicional en la primera iteración

for(Umbral in seq(1, 0, by = -0.005)) {
  
  Prediccion <- ifelse(Score >= Umbral, 1, 0)
  
  MC <- table(Clase, Pred = factor(Prediccion, levels = c(0, 1)))
  
  # Condicional para no imprimir puntos repetidos
  if(FP_r != MC[1, 2] / sum(MC[1, ]) | TP_r != MC[2, 2] / sum(MC[2, ])) {
    
    FP_r <- MC[1, 2] / sum(MC[1, ])  # Tasa de Falsos Positivos
    TP_r <- MC[2, 2] / sum(MC[2, ])  # Tasa de Verdaderos Positivos
    
    # Graficamos punto
    points(FP_r, TP_r, col = "blue")
    text(FP_r + 0.02, TP_r - 0.02, Umbral)
    
    # Imprimimos resultados
    cat("Punto i = ", i, "\n")  
    cat("Umbral = T = ", Umbral, "\n")
    cat("MC = \n")
    print(MC)
    cat("Tasa FP = ", round(FP_r, 2), "\n")
    cat("Tasa TP = ", round(TP_r, 2), "\n") 
    cat("\n") 
    
    i <- i + 1  # Aumentamos contador
    
  }
  
}

## Punto i =  1 
## Umbral = T =  1 
## MC = 
##      Pred
## Clase  0  1
##     0 10  0
##     1 10  0
## Tasa FP =  0 
## Tasa TP =  0 
## 
## Punto i =  2 
## Umbral = T =  0.9 
## MC = 
##      Pred
## Clase  0  1
##     0 10  0
##     1  9  1
## Tasa FP =  0 
## Tasa TP =  0.1 
## 
## Punto i =  3 
## Umbral = T =  0.8 
## MC = 
##      Pred
## Clase  0  1
##     0 10  0
##     1  8  2
## Tasa FP =  0 
## Tasa TP =  0.2 
## 
## Punto i =  4 
## Umbral = T =  0.7 
## MC = 
##      Pred
## Clase 0 1
##     0 9 1
##     1 8 2
## Tasa FP =  0.1 
## Tasa TP =  0.2 
## 
## Punto i =  5 
## Umbral = T =  0.6 
## MC = 
##      Pred
## Clase 0 1
##     0 9 1
##     1 7 3
## Tasa FP =  0.1 
## Tasa TP =  0.3 
## 
## Punto i =  6 
## Umbral = T =  0.55 
## MC = 
##      Pred
## Clase 0 1
##     0 9 1
##     1 6 4
## Tasa FP =  0.1 
## Tasa TP =  0.4 
## 
## Punto i =  7 
## Umbral = T =  0.54 
## MC = 
##      Pred
## Clase 0 1
##     0 9 1
##     1 5 5
## Tasa FP =  0.1 
## Tasa TP =  0.5 
## 
## Punto i =  8 
## Umbral = T =  0.53 
## MC = 
##      Pred
## Clase 0 1
##     0 8 2
##     1 5 5
## Tasa FP =  0.2 
## Tasa TP =  0.5 
## 
## Punto i =  9 
## Umbral = T =  0.52 
## MC = 
##      Pred
## Clase 0 1
##     0 7 3
##     1 5 5
## Tasa FP =  0.3 
## Tasa TP =  0.5 
## 
## Punto i =  10 
## Umbral = T =  0.51 
## MC = 
##      Pred
## Clase 0 1
##     0 7 3
##     1 4 6
## Tasa FP =  0.3 
## Tasa TP =  0.6 
## 
## Punto i =  11 
## Umbral = T =  0.505 
## MC = 
##      Pred
## Clase 0 1
##     0 6 4
##     1 4 6
## Tasa FP =  0.4 
## Tasa TP =  0.6 
## 
## Punto i =  12 
## Umbral = T =  0.4 
## MC = 
##      Pred
## Clase 0 1
##     0 6 4
##     1 3 7
## Tasa FP =  0.4 
## Tasa TP =  0.7 
## 
## Punto i =  13 
## Umbral = T =  0.39 
## MC = 
##      Pred
## Clase 0 1
##     0 5 5
##     1 3 7
## Tasa FP =  0.5 
## Tasa TP =  0.7 
## 
## Punto i =  14 
## Umbral = T =  0.38 
## MC = 
##      Pred
## Clase 0 1
##     0 5 5
##     1 2 8
## Tasa FP =  0.5 
## Tasa TP =  0.8 
## 
## Punto i =  15 
## Umbral = T =  0.37 
## MC = 
##      Pred
## Clase 0 1
##     0 4 6
##     1 2 8
## Tasa FP =  0.6 
## Tasa TP =  0.8 
## 
## Punto i =  16 
## Umbral = T =  0.36 
## MC = 
##      Pred
## Clase 0 1
##     0 3 7
##     1 2 8
## Tasa FP =  0.7 
## Tasa TP =  0.8 
## 
## Punto i =  17 
## Umbral = T =  0.35 
## MC = 
##      Pred
## Clase 0 1
##     0 2 8
##     1 2 8
## Tasa FP =  0.8 
## Tasa TP =  0.8 
## 
## Punto i =  18 
## Umbral = T =  0.34 
## MC = 
##      Pred
## Clase 0 1
##     0 2 8
##     1 1 9
## Tasa FP =  0.8 
## Tasa TP =  0.9 
## 
## Punto i =  19 
## Umbral = T =  0.33 
## MC = 
##      Pred
## Clase 0 1
##     0 1 9
##     1 1 9
## Tasa FP =  0.9 
## Tasa TP =  0.9 
## 
## Punto i =  20 
## Umbral = T =  0.3 
## MC = 
##      Pred
## Clase  0  1
##     0  1  9
##     1  0 10
## Tasa FP =  0.9 
## Tasa TP =  1 
## 
## Punto i =  21 
## Umbral = T =  0.1 
## MC = 
##      Pred
## Clase  0  1
##     0  0 10
##     1  0 10
## Tasa FP =  1 
## Tasa TP =  1

Algoritmo eficiente

Si bien es cierto el cálculo anterior es bastante claro, éste puede ser un poco extenso pues en cada iteración se deben considerar todos los individuos o filas.

Por esta razón se plantea el siguiente algortimo que es computacionalmente más eficiente. Para este algoritmo se requiere ordenar la tabla de datos de forma descendente según el score.

Individuo Clase Score Individuo Clase Score
18 p 0.900 7 p 0.40
15 p 0.800 2 n 0.39
19 n 0.700 12 p 0.38
4 p 0.600 16 n 0.37
1 p 0.550 8 n 0.36
20 p 0.540 10 n 0.35
3 n 0.530 9 p 0.34
6 n 0.520 11 n 0.33
13 p 0.510 17 p 0.30
5 n 0.505 14 n 0.10

Cálculo a mano del gráfico anterior usando algoritmo eficiente

N=10

P=10

Primer Punto

T=0.05

Para i=1

0.9 > T y class=p => TP=1

FP=0

TP=1

FP/10=0

TP/10=0.1

Punto=(0,0.1)

Segundo Punto

T=0.1

Para i=2

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

FP=0

TP=2

FP/10=0

TP/10=0.2

Punto=(0,0.2)

Tercer Punto

T=0.15

Para i=3

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

FP=1

TP=2

FP/10=0.1

TP/10=0.2

Punto=(0.1,0.2)

Cuarto Punto

T=0.20

Para i=4

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

FP=1

TP=3

FP/10=0.1

TP/10=0.3

Punto=(0.1,0.3)

Quinto Punto

T=0.25

Para i=5

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

0.55 > T y class=p => TP=4

FP=1

TP=4

FP/10=0.1

TP/10=0.4

Punto=(0.1,0.4)

Sexto Punto

T=0.30

Para i=6

0.9 > T y class=p => TP=1

0.8 > T y class=p=> TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

0.55 > T y class=p => TP=4

0.54 > T y class=p => TP=5

FP=1

TP=5

FP/10=0.1

TP/10=0.5

Punto=(0.1,0.5)

Séptimo Punto

T=0.35

Para i=7

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

0.55 > T y class=p => TP=4

0.54 > T y class=p => TP=5

0.53 > T y class=n => FP=2

FP=2

TP=5

FP/10=0.2

TP/10=0.5

Punto=(0.2,0.5)

Octavo Punto

T=0.4

Para i=8

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

0.55 > T y class=p => TP=4

0.54 > T y class=p => TP=5

0.53 > T y class=n => FP=2

0.52 > T y class=n => FP=3

FP=3

TP=5

FP/10=0.3

TP/10=0.5

Punto=(0.3,0.5)

Noveno Punto

T=0.45

Para i=9

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

0.55 > T y class=p => TP=4

0.54 > T y class=p => TP=5

0.53 > T y class=n => FP=2

0.52 > T y class=n => FP=3

0.51 > T y class=p => TP=6

FP=3

TP=6

FP/10=0.3

TP/10=0.6

Punto=(0.3,0.6)

Décimo Punto

T=0.5

Para i=10

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

0.55 > T y class=p => TP=4

0.54 > T y class=p => TP=5

0.53 > T y class=n => FP=2

0.52 > T y class=n => FP=3

0.51 > T y class=p => TP=6

0.505 > T y class=n => FP=4

FP=4

TP=6

FP/10=0.4

TP/10=0.6

Punto=(0.4,0.6)

Onceavo Punto

T=0.55

Para i=11

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

0.6 > T y class=p => TP=3

EL SIGUIENTE CÁLCULO ES CORRECTO

PERO NO ÚTIL PARA LA CURVA ROC

PORQUE LA CURVA ROC GRAFICA TP vs FP

0.55 > T y class=p => FN=1

0.54 > T y class=p => FN=2

0.53 > T y class=n => TN=1

0.52 > T y class=n => TN=2

0.51 > T y class=p => FN=3

0.505 > T y class=n => TN=3

0.4 > T y class=p => FN=4

ES EQUIVALENTE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

FP=4

TP=7

FP/10=0.4

TP/10=0.7

Punto=(0.4,0.7)

Doceavo Punto

T=0.6

Para i=12

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

FP=5

TP=7

FP/10=0.5

TP/10=0.7

Punto=(0.5,0.7)

Treceavo Punto

T=0.65

Para i=13

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

0.7 > T y class=n => FP=1

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

FP=5

TP=8

FP/10=0.5

TP/10=0.8

Punto=(0.5,0.8)

Catorceavo Punto

T=0.70

Para i=14

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

FP=6

TP=8

FP/10=0.6

TP/10=0.8

Punto=(0.6,0.8)

Quinceavo Punto

T=0.75

Para i=15

0.9 > T y class=p => TP=1

0.8 > T y class=p => TP=2

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

0.36 <= T y class=n => FP=7

FP=7

TP=8

FP/10=0.7

TP/10=0.8

Punto=(0.7,0.8)

Dieciseisavo Punto

T=0.80

Para i=16

0.9 > T y class=p => TP=1

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.8 <= T y class=p => TP=2

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

0.36 <= T y class=n => FP=7

0.35 <= T y class=n => FP=8

FP=8

TP=8

FP/10=0.8

TP/10=0.8

Punto=(0.8,0.8)

Dieciseitavo Punto

T=0.85

Para i=17

0.9 > T y class=p => TP=1

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.8 <= T y class=p => TP=2

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

0.36 <= T y class=n => FP=7

0.35 <= T y class=n => FP=8

0.34 <= T y class=p => TP=9

FP=8

TP=9

FP/10=0.8

TP/10=0.9

Punto=(0.8,0.9)

Dieciochavo Punto

T=0.90

Para i=18

SE DEBE INVERTIR LA DESIGUALDAD > POR <=

Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”

E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”

0.9 <= T y class=p => TP=1

0.8 <= T y class=p => TP=2

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

0.36 <= T y class=n => FP=7

0.35 <= T y class=n => FP=8

0.34 <= T y class=p => TP=9

0.33 <= T y class=n => FP=9

FP=9

TP=9

FP/10=0.9

TP/10=0.9

Punto=(0.9,0.9)

Dicimonoveno Punto

T=0.95

Para i=19

0.9 <= T y class=p => TP=1

0.8 <= T y class=p => TP=2

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

0.36 <= T y class=n => FP=7

0.35 <= T y class=n => FP=8

0.34 <= T y class=p => TP=9

0.33 <= T y class=n => FP=9

0.30 <= T y class=p => TP=10

FP=9

TP=10

FP/10=0.9

TP/10=10

Punto=(0.9,1)

Veinteavo Punto

T=0.1

Para i=20

0.9 <= T y class=p => TP=1

0.8 <= T y class=p => TP=2

0.7 <= T y class=n => FP=1

0.6 <= T y class=p => TP=3

0.55 <= T y class=p => TP=4

0.54 <= T y class=p => TP=5

0.53 <= T y class=n => FP=2

0.52 <= T y class=n => FP=3

0.51 <= T y class=p => TP=6

0.505 <= T y class=n => FP=4

0.4 <= T y class=p => TP=7

0.39 <= T y class=n => FP=5

0.38 <= T y class=p => TP=8

0.37 <= T y class=n => FP=6

0.36 <= T y class=n => FP=7

0.35 <= T y class=n => FP=8

0.34 <= T y class=p => TP=9

0.33 <= T y class=n => FP=9

0.30 <= T y class=p => TP=10

0.1 <= T y class=n => FP=10

FP=10

TP=10

FP/10=10

TP/10=10

Punto=(1,1)


Ejemplo Paso a Paso (deben estar ordenados en sentido decreciente)

Veamos el código que implementa el algorimo eficiente.

Clase <- c(1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0)
Score <- c(.9, .8, .7, .6, .55, .54, .53, .52, .51, .505, .4, .39, .38, .37, .36, .35, .34, .33, .30, .1)

plotROC(Score, Clase)

Umbral<-min(Score)
Paso <- (max(Score) - min(Score)) / 20

N <- 10 # ceros
P <- 10 # unos

TP <- 0 
FP <- 0

for(i in 1:20) { 
  
  if(Score[i] > Umbral)
    if(Clase[i] == 1)
      TP <- TP + 1
    else 
      FP <- FP + 1
    else 
      if(Clase[i] == 0)
        FP <- FP + 1
      else 
        TP <- TP + 1
      
      # Graficamos punto
      points(FP / N, TP / P, col = "blue")
      text(FP / N + 0.02, TP / P - 0.02, i)
      
      Umbral <- Umbral + Paso  
}

Ejemplo Paso a Paso a pie y con el Algoritmo

Ejemplo Paso a Paso (deben estar ordenados en sentido decreciente)

Inicializado para que dé igual a la corrida a pie

Clase <- c(1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0)
Score <- c(.9, .8, .7, .6, .55, .54, .53, .52, .51, .505, .4, .39, .38, .37, .36, .35, .34, .33, .30, .1)

plotROC(Score, Clase)

# Aquí se inicializan para que dé igual a la corrida a pie
Umbral <- 0.05
Paso <- 0.05

N <- 10 # ceros
P <- 10 # unos

TP <- 0 
FP <- 0

for(i in 1:20) {
  
  if(Score[i] > Umbral)
    if(Clase[i] == 1)
      TP <- TP + 1
    else 
      FP <- FP + 1
    else 
      if(Clase[i] == 0)
        FP <- FP + 1
      else 
        TP <- TP + 1
      
      # Graficamos punto
      points(FP / N, TP / P, col = "blue")
      text(FP / N + 0.02, TP/P - 0.02, round(Umbral, 2))
      
      # Imprimimos resultado
      cat("Punto i = ", i, "\n")  
      cat("Umbral = T = ", Umbral, "\n")
      cat("FP/N = ", round(FP / N, 2), "\n")
      cat("TP/P = ", round(TP / P, 2), "\n") 
      cat("\n") 
      
      Umbral <- Umbral + Paso  
}

Punto i =  1 
Umbral = T =  0.05 
FP/N =  0 
TP/P =  0.1 

Punto i =  2 
Umbral = T =  0.1 
FP/N =  0 
TP/P =  0.2 

Punto i =  3 
Umbral = T =  0.15 
FP/N =  0.1 
TP/P =  0.2 

Punto i =  4 
Umbral = T =  0.2 
FP/N =  0.1 
TP/P =  0.3 

Punto i =  5 
Umbral = T =  0.25 
FP/N =  0.1 
TP/P =  0.4 

Punto i =  6 
Umbral = T =  0.3 
FP/N =  0.1 
TP/P =  0.5 

Punto i =  7 
Umbral = T =  0.35 
FP/N =  0.2 
TP/P =  0.5 

Punto i =  8 
Umbral = T =  0.4 
FP/N =  0.3 
TP/P =  0.5 

Punto i =  9 
Umbral = T =  0.45 
FP/N =  0.3 
TP/P =  0.6 

Punto i =  10 
Umbral = T =  0.5 
FP/N =  0.4 
TP/P =  0.6 

Punto i =  11 
Umbral = T =  0.55 
FP/N =  0.4 
TP/P =  0.7 

Punto i =  12 
Umbral = T =  0.6 
FP/N =  0.5 
TP/P =  0.7 

Punto i =  13 
Umbral = T =  0.65 
FP/N =  0.5 
TP/P =  0.8 

Punto i =  14 
Umbral = T =  0.7 
FP/N =  0.6 
TP/P =  0.8 

Punto i =  15 
Umbral = T =  0.75 
FP/N =  0.7 
TP/P =  0.8 

Punto i =  16 
Umbral = T =  0.8 
FP/N =  0.8 
TP/P =  0.8 

Punto i =  17 
Umbral = T =  0.85 
FP/N =  0.8 
TP/P =  0.9 

Punto i =  18 
Umbral = T =  0.9 
FP/N =  0.9 
TP/P =  0.9 

Punto i =  19 
Umbral = T =  0.95 
FP/N =  0.9 
TP/P =  1 

Punto i =  20 
Umbral = T =  1 
FP/N =  1 
TP/P =  1